package Repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import ClassesBasicas.Estadio;
import Conexao.GConexao;
import Conexao.IConexao;
import erro.ConexaoException;
import erro.RepositorioException;



/**
 * Camada de acesso aos dados da classe Estadio no modelo DAO 
 *      
 * @author Leyla
 *
 */

public class RepEstadio implements IRepEstadio{
        
        /* Representa o GConexão */
        
        private IConexao conexao;
        
        /**Quando o objeto RepEstadio for instanciado, este construtor ir� instanciar o GConex�o
         * com uma Singleton da GConex�o
         */
        
        public RepEstadio(){
                conexao = GConexao.getInstancia();
        }
        
        /**
         * Insere um Estádio no Banco de Dados
         * 
         * @throws ConexaoException, RepositorioException
         * @param Estadio
         */
        
        @Override
        public void salvar(Estadio est) throws ConexaoException, RepositorioException {
                Connection c = conexao.conectar();
                
                String sqlSalvarEst = "INSERT INTO Estadio(nome_Estadio,local_Estadio,pais_cod_pais) values(?,?,?)";
                try{
                        PreparedStatement pstm = c.prepareStatement(sqlSalvarEst);
                        pstm.setString(1, est.getNomeEstadio());
                        pstm.setString(2, est.getLocalEstadio());
                        pstm.setInt(3, est.getCodPais());
                        pstm.executeUpdate();
                        pstm.close();
                }
                catch(SQLException e){
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
        }

        /**
         * Consulta um Estádio pelo código e retorna um Estádio
         * 
         * @throws ConexaoException,RepositorioException
         * @return Estadio
         */
        
        @Override
        public Estadio consultar(int codEstadio) throws ConexaoException,RepositorioException {
                Estadio est = null;
                
                Connection c = conexao.conectar();
                
                String sqlConsultEstById = "SELECT cod_Estadio,nome_Estadio,local_Estadio FROM Estadio WHERE(cod_Estadio = ?) ";
                
                try {
                        PreparedStatement pstm = c.prepareStatement(sqlConsultEstById);
                        pstm.setInt(1,codEstadio);
                        ResultSet result = pstm.executeQuery();
                        
                        if(result.next()){
                                est = new Estadio();
                                est.setCodEstadio(result.getInt("codEstadio"));
                                est.setNomeEstadio(result.getString("nomeEstadio"));
                                est.setLocalEstadio(result.getString("localEstadio"));
                        }
                        
                } catch (SQLException e) {
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
                return est;
        }
        
        /**
         * Consulta um Estadio pelo nome
         * 
         * @throws ConexaoException,RepositorioException
         * @return Estadio
         * 
         */
        
        @Override
        public Estadio consultar(String nomeEstadio) throws ConexaoException,RepositorioException {
                Estadio est = null;
                
                Connection c = conexao.conectar();
                
                String sqlConsultEstById = "SELECT cod_Estadio,nome_Estadio,local_Estadio FROM Estadio WHERE(nome_Estadio = ?) ";
                
                try {
                        PreparedStatement pstm = c.prepareStatement(sqlConsultEstById);
                        pstm.setString(1,nomeEstadio);
                        ResultSet result = pstm.executeQuery();
                        
                        if(result.next()){
                        	est = new Estadio();
                        	est.setCodEstadio(result.getInt("codEstadio"));
                        	est.setNomeEstadio(result.getString("nomeEstadio"));
                        	est.setNomeEstadio(result.getString("localEstadio"));
                        }
                        
                } catch (SQLException e) {
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
                return est;
        }
        
        /**
         * Exclui um Estádio pelo código
         * 
         * @param int
         * @return void
         * @throws ConexaoException,RepositorioException
         */
        
        @Override
        public void excluir(int codEstadio) throws ConexaoException,RepositorioException  {
                
                Connection c = conexao.conectar();
                
                String sqlExcluirEst = "DELETE FROM Estadio WHERE(cod_Estadio = ?)";
                
                try {
                        PreparedStatement pstm = c.prepareStatement(sqlExcluirEst);
                        pstm.setInt(1, codEstadio);
                        pstm.executeUpdate();
                        pstm.close();
                } catch (SQLException e) {
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
        }
        
        /**
         * Exclui um Estádio pelo nome
         * 
         * @param String
         * @return void
         * @throws ConexaoException,RepositorioException
         */
        
    @Override
        public void excluir(String nomeEstadio) throws ConexaoException,RepositorioException{
                
                Connection c = conexao.conectar();
                
                String sqlExcluirEst = "DELETE FROM Estadio WHERE(nome_Estadio = ?)";
                
                try {
                        PreparedStatement pstm = c.prepareStatement(sqlExcluirEst);
                        pstm.setString(1, nomeEstadio);
                        pstm.executeUpdate();
                        pstm.close();
                } catch (SQLException e) {
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
        }
        
        /**
         * Lista todos os Estádios
         * 
         * @return Collection<Estadio>
         * @throws ConexaoException,RepositorioException
         */
        
        @Override
        public Collection<Estadio> listar() throws ConexaoException,RepositorioException {
                Estadio est = null; 
                ArrayList<Estadio> lista = new ArrayList<Estadio>();
                
                Connection c = conexao.conectar();
                
                String sqlListaEst = "SELECT cod_Estadio, nome_Estadio, local_Estadio FROM Estadio";
                
                try {
                        PreparedStatement pstm = c.prepareStatement(sqlListaEst);
                        ResultSet result = pstm.executeQuery();
                        
                        while(result.next()){
                        	est = new Estadio();
                        	est.setCodEstadio(result.getInt(1));
                        	est.setNomeEstadio(result.getString(2));
                        	est.setLocalEstadio(result.getString(3));
                        	lista.add(est);
                        }
                } catch (SQLException e) {
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
                return lista;
        }
}